import 'reflect-metadata'

class MyClass {
  myProperty: string
  // 给 name 属性添加一个 address 元数据 ( 元数据是保存到 MyClass.prototype 上的 ) 值是 'zf'
  @Reflect.metadata('address', 'zf')
  @Reflect.metadata('x', 'xx')
  @Reflect.metadata('y', 'yy')
  name = 'zs'

  constructor(value: string) {
    this.myProperty = value
  }

  // 给 myMethod 添加一个 data1 的元数据 ( 元数据是保存到 MyClass.prototype 上的 ) 其中值是 { a: 1, b: 2 }
  @Reflect.metadata('data1', { a: 1, b: 2 })
  // 给 myMethod 添加一个 data2 的元数据 其中值是 'c'
  @Reflect.metadata('data2', 'c')
  myMethod() {
    console.log('执行 myMethod')
  }
}

const instance = new MyClass('zs')

// 给 instance 实例对象的 name 添加一个元数据 key 是 'z' 值是 's'
Reflect.defineMetadata( 'z', 's', instance, 'name')
Reflect.defineMetadata('l', 's', instance)
console.log(Reflect.getMetadata('z', instance, 'name'))
console.log(Reflect.getMetadata('l', instance))


// 获取 instance 上 name 属性自身的所有元数据 ( 不包含 instance 原型链中 name 属性 ) 的键组成的数组
console.log(Reflect.getOwnMetadataKeys(instance, 'name')) // [ 'z' ]


// 获取 instance 的原型对象上 name 属性自身的所有元数据的键组成的数组 
console.log(Reflect.getOwnMetadataKeys(Object.getPrototypeOf(instance), 'name')) // [ 'y', 'x', 'address' ]

